// 导入基础URL配置
import baseURL from '@/utils/config.js';

// 定义 requestLock 用于存储正在进行的请求
const requestLock = new Set();

// 封装请求函数
export default function(options) {
  // 生成请求的唯一键值
  const requestKey = `${options.url}-${JSON.stringify(options.data || {})}`;

  // 检查是否已经存在相同的请求
  if (requestLock.has(requestKey)) {
    console.log(`Request to ${options.url} is already in progress.`);
    return Promise.reject(new Error('Duplicate request.'));
  }

  // 添加请求到锁中
  requestLock.add(requestKey);

  // 如果 options.loading 为 1，则显示加载效果
  if (options.loading === 1) {
    uni.showLoading({
      title: options.loadingText || '加载中...',
      mask: true
    });
  }

  return new Promise((resolve, reject) => {
    // 获取 token
    const token = uni.getStorageSync('token');

    // 根据请求类型选择合适的请求方法
    if (options.filePath) {
      // 文件上传请求
      uni.uploadFile({
        url: baseURL + options.url,
        filePath: options.filePath,
        name: options.name || 'file',
        formData: options.data || {},
        header: {
          'Authorization': token,
        },
        success: uploadRes => {
          const res = JSON.parse(uploadRes.data);
          handleResponse(res, resolve, reject, requestKey, options.loading);
        },
        fail: error => {
          handleError(error, reject, requestKey, options.loading);
        }
      });
    } else {
      // 普通请求
      uni.request({
        url: baseURL + options.url,
        method: options.method || 'POST',
        data: options.data || {},
        timeout: 1000 * 60 * 5, // 设置超时时间为 5 分钟
        header: {
          'Content-Type': 'application/json; charset=utf-8',
          'Authorization': token,
        },
        success: res => {
          handleResponse(res.data, resolve, reject, requestKey, options.loading);
        },
        fail: error => {
          handleError(error, reject, requestKey, options.loading);
        }
      });
    }
  });
}

// 处理响应数据的通用函数
function handleResponse(res, resolve, reject, requestKey, loading) {
  // 请求完成后解除锁定
  requestLock.delete(requestKey);

  // 请求完成后隐藏加载效果
  if (loading === 1) {
    uni.hideLoading();
  }

  // 根据响应码处理不同的情况
  switch (res.code) {
    case 401:
    case 402:
      // 清除 token 并提示重新登录
      uni.removeStorageSync('token');
      uni.showToast({
        title: '请重新登录！',
        icon: 'error'
      });
      setTimeout(() => {
        uni.reLaunch({
          url: '/pages/login/login'
        });
      }, 1000);
      break;
    case 500:
      // 服务器错误
      uni.showToast({
        title: res.msg || '服务器错误，请稍后重试。',
        icon: 'none'
      });
      reject(new Error(res.msg || 'Server Error'));
      break;
    default:
      // 其他情况，根据消息提示用户
      if (res.msg === '操作成功'||res.msg === '查询成功') {
        // 操作成功，直接 resolve
        resolve(res);
      } else if (res.msg) {
        uni.showToast({
          title: res.msg,
          icon: 'none'
        });
        resolve(res); // 或者根据需求选择 reject(res)
      } else {
        resolve(res); // 默认情况下，直接 resolve
      }
      break;
  }
}

// 错误处理函数
function handleError(error, reject, requestKey, loading) {
  // 请求失败后解除锁定
  requestLock.delete(requestKey);

  // 请求失败后隐藏加载效果
  if (loading === 1) {
    uni.hideLoading();
  }

  // 检查 TCP 连接状态
  const isTCPConnected = uni.getStorageSync("TCPConnect") || false;
  if (!isTCPConnected) {
    uni.showToast({
      title: "联系管理员",
      icon: 'error',
      duration: 2000
    });
  }

  // 拒绝请求
  reject(error);
}